﻿using Prism.Ioc;
using Prism.Modularity;
using Vision.Abstractions;
using Vision.Abstractions.Processing;
using Vision.Devices;
using Vision.Host.Runtime;
using Vision.Processing;

namespace Vision.Host
{
	public class HostModule : IModule
	{
        /// <summary>
        /// 模块初始化完成后调用。用于启动必要的后台服务。
        /// </summary>
        public void OnInitialized(IContainerProvider containerProvider)
        {
            // 解析并启动图像处理服务（ImageProcessingService）。
            // 该服务负责从图像总线获取相机帧并进行处理，通常在后台线程中持续运行。
            // 只需解析一次即可自动启动，无需手动保存引用。
            var processingService = containerProvider.Resolve<ImageProcessingService>();
        }

        /// <summary>
        /// 注册依赖注入容器中的所有类型和服务。
        /// </summary>
        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            // 注册图像总线为单例，负责在各模块间传递图像消息。
            containerRegistry.RegisterSingleton<IImageBus, ImageBus>();

            // 注册 FakeCamera，每次解析时注入 IImageBus.Writer 作为输出通道。
            // FakeCamera 用于模拟相机采集，生成测试图像。
            containerRegistry.RegisterSingleton<FakeCamera>(c => new FakeCamera(c.Resolve<IImageBus>().Writer));

            // 注册图像处理器为单例，实际处理图像帧（如二值化、边缘检测等）。
            containerRegistry.RegisterSingleton<IImageProcessor, OpenCvImageProcessor>();

            // 注册图像处理参数为单例，集中管理处理相关的参数（如阈值等）。
            containerRegistry.RegisterSingleton<IImageProcessingParameters, ImageProcessingParameters>();

            // 注册图像处理服务为单例，负责调度图像采集、处理和消息分发。
            containerRegistry.RegisterSingleton<ImageProcessingService>();

            //在 Prism 中选择服务的生命周期，主要依据服务的用途、状态管理需求和资源消耗。以下是常见场景和建议：
            // 1. **单例（Singleton）**：适用于全局唯一的服务，如配置管理、日志记录、事件总线等。
            //    这些服务通常在应用程序生命周期内保持不变，且需要跨多个模块共享状态。

            // 2. **瞬态（Transient）**：适用于轻量级、无状态的服务，如简单的工具类或工厂。
            //    每次请求都会创建新的实例，适合不需要共享状态的服务。

            // 3. **工厂/自定义实例（Factory）**:  适用于需要根据特定条件或参数创建服务实例的情况。
            //    当需要根据特定条件或参数创建服务实例时，可以使用工厂模式。

        }

    }
}
